package main

import (
	"context"
	"fmt"
	"time"
)

func main() {
	ctx, cancelFunc := context.WithCancel(context.Background())
	go Speak(ctx)
	time.Sleep(3 * time.Second)
	//执行取消方法,实际上时关闭上下文对象中德通道。
	//因此子协程中可以通过ctx.Done()获取到信息
	cancelFunc()
	time.Sleep(3 * time.Second)
}

func Speak(ctx context.Context) {
	//tick := time.Tick(time.Second)
	//fmt.Println(tick, reflect.TypeOf(tick))
	////针对chan的循环，只能接收内容，无法使用index确认当前迭代数量
	//for t := range tick {
	//	fmt.Println(t)
	//}
	for range time.Tick(time.Second) {
		select {
		//获取上下文通道的数据
		case <-ctx.Done():
			fmt.Println("终止执行")
			return
		default:
			fmt.Println("Speak, 执行中")
		}
	}
}
